﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Sinacor.Infra.Core.ProcessManager.Server;
using PSE.ProcessManager.Server.InteligenceModules;
using PSE.ProcessManager.Common.Gateway;

namespace Sinacor.Process.Bovespa.Distribuicao.Server.ProcessImplementation
{
    public class Exportacao : SinacorBaseProcessServer<ProcessLogic.Exportacao>, ISimpleExecutionProcess
    {
        #region Construtor

        /// <summary>
        /// Construtor padrão
        /// </summary>
        public Exportacao()
        {
            this.Id = ProcessEntity.Catalog.Exportacao.ProcessID;
            this.Name = "Exportacao";
            this.ProcessLogic.ExportacaoConcluida += new EventHandler<PSE.ProcessManager.Common.Process.ProcessEventArgs<Sinacor.Process.Bovespa.Distribuicao.ProcessEntity.ResultadoExportacao>>(ProcessLogic_ExportacaoConcluida);
        }

        #endregion

        #region Métodos

        /// <summary>
        /// Enviar Mensagem Importacao Concluida
        /// </summary>
        private void EnviarMensagemExportacaoConcluida(ProcessEntity.ResultadoExportacao resultado)
        {
            this.SendMessage(
                                new Message<ProcessEntity.ResultadoExportacao>()
                                {
                                    ProcessId = this.Id,
                                    MessageId = ProcessEntity.Catalog.Exportacao.ExportacaoConcluida.MessageID,
                                    Parameter = resultado
                                });
        }

        /// <summary>
        /// Execute
        /// </summary>
        /// <param name="message"></param>
        public void ExportarDistribuicao(BaseMessage message)
        {
            bool fail = false;

            try
            {
                //while (!System.Diagnostics.Debugger.IsAttached)
                //    System.Threading.Thread.Sleep(1000);

                if (!IsAborted)
                {
                    this.ProcessLogic.ExportarDistribuicao(message.RetrieveParameter<ProcessEntity.Parameter.FiltroExportacaoDistribuicao>());
                }
            }
            catch (Exception ex)
            {
                fail = true;
                this.HandleException(ex);
            }
            finally
            {
                this.Finalize(fail);
            }
        }

        private void ProcessLogic_ExportacaoConcluida(object sender, Sinacor.Process.Bovespa.Distribuicao.ProcessEntity.ResultadoExportacao e)
        {
            EnviarMensagemExportacaoConcluida(e);
        }

        private void ProcessLogic_ExportacaoConcluida(object sender, PSE.ProcessManager.Common.Process.ProcessEventArgs<Sinacor.Process.Bovespa.Distribuicao.ProcessEntity.ResultadoExportacao> e)
        {
            EnviarMensagemExportacaoConcluida(e.Parameter);
        }

        #endregion

        #region ISimpleExecutionProcess Members

        public void Execute(PSE.ProcessManager.Common.Gateway.BaseMessage message)
        {
            this.Finalize();
        }

        #endregion
    }
}
